package cn.xiaolang.thread.juc;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

/**
 * 信号量示例:（我们知道可以通过信号量控制共享资源的访问，底层还是AQS这一套）
 * <p>
 * 假设有10个人在银行办理业务，只有2个工作窗口，代码实现逻辑如下
 * </p>
 *
 * @author Dean
 * @date 2020-03-17
 */
@Slf4j
public class SemaphoreStarted {

    /**
     * 从输出结果可以看出，每隔两秒，有两个线程被执行
     * 注意：
     * semaphore.acquire();
     * semaphore.release();
     * 的成对出现，没有任何线程获取信号量的时候，依然能够释放并且释放的有效。
     */
    public static void main(String[] args) {
        // 10个等待者
        int waiter = 10;
        // 2个工作者
        int worker = 2;
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        final Semaphore semaphore = new Semaphore(worker);
        for (int i = 0; i < waiter; i++) {
            final int count = i;
            executorService.submit(() -> {
                try {
                    semaphore.acquire();
                    resolve(count);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    semaphore.release();
                }
            });

        }
        executorService.shutdown();

    }

    private static void resolve(int i) throws InterruptedException {
        log.info("服务号{}，受理业务中。。。", i);
        Thread.sleep(2000);
    }
}
